package exercise.jslide.jslide.command;

import exercise.jslide.jslide.model.SlideElement;
import exercise.jslide.jslide.model.Presentation;

/**
 * <p>{@code AddShapeCommand} 类是一个命令类，用于向演示文稿中添加形状元素。</p>
 * <p>该类实现了 {@code Command} 接口，提供了执行、撤销和重做操作。</p>
 * <p>该类包含了一个 {@code SlideElement} 对象和一个 {@code Presentation} 对象。</p>
 * <p>在执行操作时，会向当前幻灯片中添加形状元素；在撤销操作时，会从当前幻灯片中移除形状元素。
 * 在重做操作时，会重新向当前幻灯片中添加形状元素。</p>
 * <p>该类的构造方法接收一个 {@code Presentation} 对象和一个 {@code SlideElement} 对象作为参数。</p>
 * <ul>
 *     <li>{@code  element}：形状元素对象</li>
 *     <li>{@code  presentation}：演示文稿对象</li>
 * </ul>
 */
public class AddShapeCommand implements Command {
    private SlideElement element;
    private Presentation presentation;

    /**
     * 该构造方法用于初始化 {@code AddShapeCommand} 对象。
     * @param presentation 演示文稿对象
     * @param element 形状元素对象
     */
    public AddShapeCommand(Presentation presentation, SlideElement element) {
        this.presentation = presentation;
        this.element = element;
    }

    /**
     * 该方法用于向演示文稿中添加形状元素。
     */
    @Override
    public void execute() {
        presentation.getCurrentSlide().addElement(element);
    }

    /**
     * 该方法用于从演示文稿中移除形状元素。
     */
    @Override
    public void undo() {
        presentation.getCurrentSlide().removeElement(element);
    }

    /**
     * 该方法用于重做操作。
     */
    @Override
    public void redo() {
        execute();
    }
}